<!DOCTYPE HTML>
<html>
<head>
<title>Thread | AutoHotkey</title>
<meta name="description" content="The Thread command sets the priority or interruptibility of threads. It can also temporarily disable all timers." />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>Thread</h1>

<p>设置<a href="../misc/Threads.htm">线程</a>的优先级或是否可以被中断. 它也可以临时禁用所有的<a href="SetTimer.htm">计时器</a>.</p>
<pre class="Syntax"><span class="func">Thread</span>, <a href="#SubCommands">SubCommand</a> <span class="optional">, Value1, Value2</span></pre>
<p><em>SubCommand</em>, <em>Value1</em> 和 <em>Value2</em> 参数互相依赖, 其用法描述如下.</p>

<h2 id="SubCommands">子命令</h2>
<p>对于 <em>SubCommand</em>, 指定以下命令之一:</p>
<ul>
    <li><a href="#NoTimers">NoTimers</a>: 防止被任何的计时器中断.</li>
    <li><a href="#Priority">Priority</a>: 更改当前线程的优先级级别.</li>
    <li><a href="#Interrupt">Interrupt</a>: 更改新启动的线程的可中断时间.</li>
</ul>

<h3 id="NoTimers">NoTimers</h3>
<p>防止被任何的计时器中断.</p>
<pre class="Syntax"><span class="func">Thread</span>, NoTimers <span class="optional">, TrueOrFalse</span></pre>
<p>此子命令防止被任何<a href="SetTimer.htm">计时器</a>中断, 直至<a href="../misc/Threads.htm">当前线程</a>结束, 或执行了 <code>Thread, NoTimers, false</code>, 或被另一个允许计时器的线程中断了(在这种情况下, 计时器可以中断正在中断的线程, 直到它完成).</p>
<p>如果自动执行段(脚本的顶部) 没有使用这个子命令, 则所有线程初始都可以被计时器中断(然而下面的 <a href="#Interrupt">Interrupt</a> 子命令设置仍会生效). 相比之下, 如果在自动执行段中打开了这个子命令, 但却从没有关闭它, 则每个新启动的<a href="../misc/Threads.htm">线程</a>(例如 <a href="../Hotkeys.htm">热键</a>, <a href="Menu.htm">自定义菜单项</a>或<a href="SetTimer.htm">计时器</a>) 初始都不会被计时器中断.</p>
<p>不论默认的设置如何, 当脚本没有其他线程时计时器总能执行(除非使用了 <a href="Pause.htm">Pause</a>).</p>
<p><code>Thread, NoTimers</code> 相当于 <code>Thread, NoTimers, true</code>. 此外, 当 <em>TrueOrFalse</em> 参数为<a href="../Variables.htm#Expressions">表达式</a>, 计算结果为真时表示为 1, 而为假时为 0.</p>

<h3 id="Priority">Priority</h3>
<p>更改当前线程的优先级级别.</p>
<pre class="Syntax"><span class="func">Thread</span>, Priority, Level</pre>
<p>指定 <em>Level</em> 为介于 -2147483648 和 2147483647 之间的整数(或<a href="../Variables.htm#Expressions">表达式</a>) 来表示当前线程的新优先级. 这不会影响其他线程. 请参阅<a href="../misc/Threads.htm">线程</a>了解详情.</p>
<p>由于具有缓冲事件的能力, 命令 <a href="Critical.htm">Critical</a> 通常优于这个子命令.</p>
<p>相关提示, 整个脚本的操作系统优先级可以这样改变 <a href="Process.htm#Priority">Process Priority</a>. 例如:</p>
<pre>Process, Priority,, High</pre>

<h3 id="Interrupt">Interrupt</h3>
<p>更改新启动的线程的可中断时间.</p>
<pre class="Syntax"><span class="func">Thread</span>, Interrupt <span class="optional">, Duration, LineCount</span></pre>
<p class="note"><strong>注意:</strong> 应该谨慎使用此子命令, 因为大多数脚本在接近默认设置的情况下执行更一致.</p>
<p>默认情况下, 每个新运行的线程在开始的 15 毫秒的 <em>持续时间</em> 或在开始的 1000 个脚本 <em>行数</em>(无论首先遇到哪个) 执行时都是不可中断的. 这使得线程有机会结束, 而不是立即被另一个等待运行的线程中断(例如缓冲的<a href="../Hotkeys.htm">热键</a>或一系列即将运行的<a href="SetTimer.htm">计时子程序</a>).</p>
<p class="note"><strong>注意:</strong> 任何小于 17 的<em>持续时间</em> 可能导致实际持续时间缩短或直接中断, 因为系统刻度计数的最小分辨率为 10 到 16 毫秒.</p>
<p>如果任一参数为 0, 则每个新启动的线程都可以立即中断. 如果任一参数为 -1, 那么此参数会使得线程不会被中断. 这两个参数的最大值为 2147483647.</p>
<p>这个子命令是全局的, 这意味着所有后续线程都会遵循它, 即使子命令在<a href="../Scripts.htm#auto">自动执行段</a>之外的其他地方使用. 然而, <a href="../misc/Threads.htm">被中断过的线程</a>则不受影响, 因为它们不可中断的时期已经期满(说明: Thread, Interrupt 仅设置新线程创建时不可中断的那个时期, 而被中断过的线程已经过了这个时期即随时都可能被中断, 所以不受此设置影响). 同样地, <a href="../misc/Threads.htm">当前线程</a>只有在改变 <em>LineCount</em> 时是不可中断的, 它才会受影响, 因为此时新的 <em>LineCount</em> 将对其生效.</p>
<p>当<a href="../misc/Threads.htm">当前线程</a>不可中断时如果按下了<a href="../Hotkeys.htm">热键</a>或选择了<a href="Menu.htm">自定义菜单项</a>, 那么这些事件会被缓冲起来. 换句话说, 到当前线程结束或变得可中断时(无论先遇到哪个) 它才会运行. 例外情况是当当前线程在结束前变得可中断并且它的<a href="#Priority">优先级</a>高于被缓冲的事件, 此时被缓冲的事件不再缓冲而丢弃了.</p>
<p>不论此子命令如何, 当一个线程显示 <a href="MsgBox.htm">MsgBox</a>, <a href="InputBox.htm">InputBox</a>, <a href="FileSelectFile.htm">FileSelectFile</a> 或 <a href="FileSelectFolder.htm">FileSelectFolder</a> 对话框时都将变成可中断的.</p>
<p>两个参数的其中每个都可以留空来保持此设置不变.</p>
<p>如果 <a href="Critical.htm">Critical</a> 被指定为线程的子程序或函数的第一行, 则线程将启动不可中断, 并且 Interrupt 子命令没有效果. 但是, 这并不适用于绑定函数或用户自定义的<a href="../objects/Functor.htm">函数对象</a>.</p>

<h2 id="Remarks">备注</h2>
<p>由于更大的伸缩性和缓冲事件的能力, 命令 <a href="Critical.htm">Critical</a> 通常比 <code>Thread Interrupt</code> 和 <code>Thread Priority</code> 更有效.</p>

<h2 id="Related">相关</h2>
<p><a href="Critical.htm">Critical</a>, <a href="../misc/Threads.htm">线程</a>, <a href="Hotkey.htm">Hotkey</a>, <a href="Menu.htm">Menu</a>, <a href="SetTimer.htm">SetTimer</a>, <a href="Process.htm">Process</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExPriority">
<p><a class="ex_number" href="#ExPriority"></a> 让当前线程的优先级比平均的稍高一点.</p>
<pre>Thread, Priority, 1</pre>
</div>

<div class="ex" id="ExInterrupt">
<p><a class="ex_number" href="#ExInterrupt"></a> 让每个新启动的线程立即变成可中断.</p>
<pre>Thread, Interrupt, 0</pre>
</div>

<div class="ex" id="ExInterrupt2">
<p><a class="ex_number" href="#ExInterrupt2"></a> 让每个线程在 50 ms 或 2000 行(无论首先遇到哪个) 之后变成可中断.</p>
<pre>Thread, Interrupt, 50, 2000</pre>
</div>

</body>
</html>